﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using Estructuras.Comunes;

namespace Estructuras.Consola.ConsolaAnalizarDatos
{
    /// <summary>
    /// Almacena las propiedades de un elemento específico.
    /// </summary>
    public class PDefinicionRegistro : Propiedades
    {
        /// <summary>
        /// Diccionario Patrones.
        /// </summary>
        public Dictionary<string, Dictionary<string, List<string>>> DiccionarioPatrones
        {
            get
            {
                if (!this.contienePropiedad(CDefinicionRegistro.DiccionarioPatrones))
                    this.addPropiedad(CDefinicionRegistro.DiccionarioPatrones, new Dictionary<string, Dictionary<string, List<string>>>());
                return (Dictionary<string, Dictionary<string, List<string>>>)this.getPropiedad(CDefinicionRegistro.DiccionarioPatrones);
            }
            set
            {
                this.setOrAddPropiedad(CDefinicionRegistro.DiccionarioPatrones, value);
            }
        }

        /// <summary>
        /// Constructor por defecto.
        /// </summary>
        public PDefinicionRegistro()
            : base()
        {
        }

        /// <summary>
        /// Obtiene los parámetros a partir del fichero XML indicado.
        /// </summary>
        /// <param name="fichero">Fichero de configuración XML</param>
        override public void leer(string fichero)
        {
            base.leer(fichero);
            XmlDocument xml = null;
            try
            {
                xml = LeerXml.AbrirFicheroParametros(fichero);
            }
            catch (Exception)
            {
                throw new Excepcion(Estructuras.Comunes.Constantes.ERROR_CARGAR_FICHERO_DEFINICION_REGISTROS, Estructuras.Comunes.Constantes.CODIGO_ERROR_CARGAR_FICHERO_DEFINICION_REGISTROS);
            }

            try
            {
                // Formatos de registros
                int numeroRegistros = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz);
                this.DiccionarioPatrones = new Dictionary<string, Dictionary<string, List<string>>>();
                for (int indiceRegistro = 0; indiceRegistro < numeroRegistros; indiceRegistro++)
                {
                    // Formato
                    string formato = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroFormato);
                    // Alias
                    Dictionary<string, List<string>> diccionario = new Dictionary<string, List<string>>();
                    int numeroAlias = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias);
                    for (int indiceAlias = 0; indiceAlias < numeroAlias; indiceAlias++)
                    {
                        // Nombre alias
                        string alias = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasNombre);
                        // Campos del alias
                        List<string> campos = new List<string>();
                        int numeroCampos = LeerXml.ObtenerNumeroNodosCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasSalida);
                        for (int indiceCampo = 0; indiceCampo < numeroCampos; indiceCampo++)
                        {
                            string campo = LeerXml.ObtenerValorCampo(xml, CDefinicionRegistro.RutaNodoRaiz, indiceRegistro, CDefinicionRegistro.NodoRegistroListaAlias, indiceAlias, CDefinicionRegistro.NodoRegistroListaAliasAliasSalida, indiceCampo);
                            campos.Add(campo);
                        }
                        diccionario.Add(alias, campos);
                    }
                    this.DiccionarioPatrones.Add(formato, diccionario);
                }
            }
            catch (Exception)
            {
                throw new Excepcion(Estructuras.Comunes.Constantes.ERROR_OBTENER_DEFINICION_REGISTROS, Estructuras.Comunes.Constantes.CODIGO_ERROR_OBTENER_DEFINICION_REGISTROS);
            }
        }
    }
}

